package com.mazaiting.screen.util

import android.content.Context
import android.graphics.Bitmap
import android.media.Image
import com.mazaiting.log.L
import java.io.File
import java.io.FileOutputStream
import java.text.SimpleDateFormat
import java.util.*

/***
 *
 *
 *                                                    __----~~~~~~~~~~~------___
 *                                   .  .   ~~//====......          __--~ ~~
 *                   -.            \_|//     |||\\  ~~~~~~::::... /~
 *                ___-==_       _-~o~  \/    |||  \\            _/~~-
 *        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *  .~       .~       |   \\ -_    /  /-   /   ||      \   /
 * /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 * |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *          '         ~-|      /|    |-~\~~       __--~~
 *                      |-~~-_/ |    |   ~\_   _-~            /\
 *                           /  \     \__   \/~                \__
 *                       _--~ _/ | .-~~____--~-/                  ~~==.
 *                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                 -_     ~\      ~~---l__i__i__i--~~_/
 *                                 _-~-__   ~)  \--______________--~~
 *                               //.-~~~-~_--~- |-------~~~~~~~~
 *                                      //.-~~~--\
 *                               神兽保佑
 *                              代码无BUG!
 * @author mazaiting
 * @date 2019-07-22
 * @description 文件操作工具类
 */
class FileUtil {
    companion object {
        /**
         * 获取文件路径: /sdcard/Android/data/<packageName>/cache/
         * @param context 上下文
         * @return 路径
         */
        fun getDir(context: Context): String {
            return context.externalCacheDir?.absolutePath.toString()
        }

        /**
         * 获取文件名
         * @param context 上下文
         * @return 文件名
         */
        fun getFileName(context: Context): String {
            // 创建文件夹
            createDir(context)
            return  "${getDir(context)}/${System.currentTimeMillis()}.png"
        }

        /**
         * 获取年月日: 形如 20190723
         * return 日期
         */
        private fun getDate(): String {
            // 创建格式化工具
            val format = SimpleDateFormat("yyyyMMdd", Locale.CHINA)
            return format.format(Date())
        }

        /**
         * 创建文件夹路径
         * @param context 上下文
         */
        fun createDir(context: Context) {
            // 创建文件夹
            val file = File(getDir(context))
            // 检测是否为文件夹
            if (file.isDirectory) {
                // 如果是文件夹判断是否存在
                if (!file.exists()) {
                    // 如果不存在则创建
                    file.mkdirs()
                }
            }
        }

        /**
         * 保存 Bitmap 到文件
         * @param bitmap 保存图像
         * @param imageName 文件名
         * @return true: 保存成功; false: 保存失败
         */
        fun saveBitmap(bitmap: Bitmap?, imageName: String): Boolean {
            // 保存图像
            if (null != bitmap) {
                try {
                    // 如果文件不存在则创建
                    val fileImage = File(imageName)
                    if (!fileImage.exists()) {
                        fileImage.createNewFile()
                        L.d("image file created")
                    }
                    // 保存图片
                    val out = FileOutputStream(fileImage)
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)
                    out.flush()
                    out.close()
                    return true
                } catch (e: Exception) {
                    L.d(e.message)
                }

            }
            return false
        }

        /**
         * 从 Image 中获取 Bitmap
         * @param image 图像
         * @return Bitmap 数据
         */
        fun getBitmap(image: Image): Bitmap? {
            // 获取高度
            val width = image.width
            // 获取图片宽度
            val height = image.height
            // 获取图片像素数组
            val planes = image.planes
            // 获取缓冲
            val buffer = planes[0].buffer
            // 获取像素
            val pixelStride = planes[0].pixelStride
            // 获取行
            val rowStride = planes[0].rowStride
            // 获取内边距
            val rowPadding = rowStride - pixelStride * width
            // 创建图像
            val bitmap: Bitmap? = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888)
            // 从缓冲区获取 Bitmap
            bitmap!!.copyPixelsFromBuffer(buffer)
            // 销毁旧的图片
            image.close()
            // 创建 Bitmap
            return Bitmap.createBitmap(bitmap, 0, 0, width, height)
        }
    }
}
